'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title || 'LMSite' // 页面标题，主站标题

// 如果您的端口设置为80，使用管理员权限执行命令行。例如，Mac：sudo npm run
// 您可以通过以下方法更改端口：
// 【 port = 9528 npm run dev 】 或者 【 npm run dev --port = 9528 】
const port = process.env.port || process.env.npm_config_port || 9528 // dev 端口

// 所有配置项说明都可以在 https://cli.vuejs.org/config/ 中找到
module.exports = {
  /**
   * 如果您打算在子路径下部署站点，则需要设置publicPath，例如GitHub Pages。如果您打算将站点部署到 https://foo.github.io/bar/,
   * 那么publicPath应该设置为 "/bar/" 。
   * 在大多数情况下，请使用 '/'
   * 详细参考: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: port,
    open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    before: require('./mock/mock-server.js')
  },
  pages: {
    index: {
      entry: 'src/pages/index/main.js',
      template: 'public/index/index.html',
      filename: 'index.html',
      // template 中的 title 标签需要是 ` <title><%= htmlWebpackPlugin.options.title %></title> `
      title: 'LMSite - 首页'
    },
    admin: {
      entry: 'src/pages/admin/main.js',
      template: 'public/admin/index.html',
      filename: 'index.html',
      title: 'LMSite - 后台管理'
    }
  },
  configureWebpack: {
    // 在webpack的名称字段中提供应用程序的标题，以便可以在index.html中访问它，以注入正确的标题。
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },
  chainWebpack(config) {
    if (config.plugins.has('preload')) {
      config.plugin('preload').tap(() => [
        {
          rel: 'preload',
          // to ignore runtime.js
          fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
          include: 'initial'
        }
      ])
    }

    // 当页面较多时，会导致太多无意义的请求
    config.plugins.delete('prefetch')

    // 设置 svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    // 设置 preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
              // `runtime`必须与runtimeChunk名称相同。默认值为`runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  priority: 10,
                  // 仅打包最初依赖的第三方
                  chunks: 'initial'
                },
                elementUI: {
                // 将elementUI拆分到单个包中
                  name: 'chunk-elementUI',
                  // 该值需要大于 libs 和 app，否则将打包成 libs 或 app
                  priority: 20,
                  // 为了适应 cnpm
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/
                },
                commons: {
                  name: 'chunk-commons',
                  // 可以自定义您的规则
                  test: resolve('src/components'),
                  // minimum common number 最小共同数
                  minChunks: 3,
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
          config.optimization.runtimeChunk('single')
        }
      )
  }
}
